"""
声纹识别服务
提供声纹特征提取功能，使用工厂模式创建具体实现
"""

import os
from typing import Tuple, Dict, Any

# 导入声纹识别工厂类
from .factory import VoiceprintFactory
# 导入返回码枚举
from ..constants.return_codes import BaseCodeEnum, VPErrorCode
# 导入日志工具
from ..utils.logger import get_logger


class VoiceprintService:
    """
    声纹识别服务类
    作为使用者角色，通过工厂类获取具体实现完成声纹识别功能
    """

    def __init__(self):
        """
        初始化声纹识别服务
        """
        # 初始化日志记录器
        self.logger = get_logger(__name__)
        # 通过工厂创建声纹识别实现实例
        self.voiceprint_implementation = VoiceprintFactory.create_implementation()
        self.logger.info(f"已加载声纹识别实现: {type(self.voiceprint_implementation).__name__}")

    def extract_voiceprint(self, audio_file: str) -> Tuple[BaseCodeEnum, Dict[str, Any]]:
        """
        提取音频的声纹特征
        
        Args:
            audio_file: 音频文件路径
            
        Returns:
            Tuple[int, str, Dict[str, Any]]: (状态码, 声纹ID, 结果信息)
            - 状态码: 200表示成功，5001表示参数错误，5002表示文件不存在，5003表示提取失败
            - 声纹ID: 基于声纹特征生成的唯一标识符
            - 结果信息: 包含特征提取详情的字典
        """
        self.logger.info(f"开始提取声纹特征: audio_file={audio_file}")

        # 参数验证
        if not audio_file:
            self.logger.error("音频文件路径为空")
            return VPErrorCode.AUDIO_NOT_FOUND, {}

        if not os.path.exists(audio_file):
            self.logger.error(f"音频文件不存在: {audio_file}")
            return VPErrorCode.AUDIO_NOT_FOUND, {}

        try:
            # 使用工厂创建的具体实现进行声纹特征提取
            status, result = self.voiceprint_implementation.extract_voiceprint(
                audio_file=audio_file
            )
            return status, result

        except Exception as e:
            # 捕获实现类抛出的异常并转换为标准错误码
            self.logger.error(f"声纹识别实现类调用失败: {str(e)}")
            return VPErrorCode.CONVERSION_FAILED, {}
